import { Config, Provide } from '@midwayjs/core';
import * as crypto from 'crypto';

@Provide()
export class CryptoService {
  @Config('crypto.salt')
  salt: string; // d48ed87cf4a7033f4a0c63f643b815aa

  /**
   * 加盐加密
   * @param target
   * @returns
   */
  md5(target: string) {
    return crypto.createHash('md5').update(target).digest('hex');
  }

  /**
   * 密码加密
   * @description 密码加密，默认使用md5加密，也可以传入已加密的密码
   * @param password
   * @param isHash
   * @returns
   */
  password(password: string, isHash: boolean = false) {
    const hashPwd = isHash ? password : this.md5(password);
    return this.md5(hashPwd + ':' + this.md5(this.salt));
  }

  /**
   * 验证密码是否正确
   * @param password 用户输入的明文密码
   * @param hash 数据库中存储的加密密码
   * @returns 密码是否匹配
   */
  verifyPassword(password: string, hash: string): boolean {
    const hashedPassword = this.password(password, true);
    // 使用 crypto.timingSafeEqual 防止时序攻击
    try {
      return crypto.timingSafeEqual(
        Buffer.from(hashedPassword.toLocaleLowerCase(), 'hex'),
        Buffer.from(hash.toLocaleLowerCase(), 'hex')
      );
    } catch (error) {
      // 如果 buffer 长度不匹配，timingSafeEqual 会抛出错误
      return false;
    }
  }


}
